#include <iostream>
#include <string>
#include <memory>
#include <cassert>

// 简单工厂模式。
//用一个纯虚类让子类继承并重写类函数。

class Fruit
{
public:
    virtual void name() = 0;
};

class Apple : public Fruit
{
public:
    void name() override
    {
        std::cout << "这是一个苹果。" << std::endl;
    }
};

class Orange : public Fruit
{
public:
    void name() override
    {
        std::cout << "这是一个橘子。" << std::endl;
    }
};

class FruitFactory
{
public:
    // 可以将子类赋值给父类
    // std::shared_ptr<Fruit> Make_Name(const std::string& s)
    static std::shared_ptr<Fruit> Make_Name(const std::string& s)
    {
        if(s == "苹果")
        {
            return std::make_shared<Apple>();
        }
        else if(s == "橘子")
        {
            return std::make_shared<Orange>();
        }
        else
        {
            assert(false);
        }
    }
};

int main()
{
    //FruitFactory f1;
    
    // 返回的类型为static静态类型，无需使用类对象调用类函数，可直接调用。
    // 因为static从程序一开始就创建好了的，不需要格外去管他。
    FruitFactory::Make_Name("苹果")->name();
    FruitFactory::Make_Name("橘子")->name();
    // f1.Make_Name("苹果")->name();
    // f1.Make_Name("橘子")->name();

    return 0;
}